//codigo da modificacao

//incluir a compilacao deste arquivo no make

#include "sched_mod.h"


//****************************** FUNCOES DA TABELA **************************************

void imprime_tabela(Tabela_processos *ProcessosRT)
{
	int i;
	for(i=0;i<Max_tabela;i++)
	{
		if(ProcessosRT->Linha[i].PID != 0)
		{printf("\n%d - %f - %f", ProcessosRT->Linha[i].PID, ProcessosRT->Linha[i].Intervalo, ProcessosRT->Linha[i].Tmax);}
	}
}

//funcao de limpar a tabela
void limpa_tabela(Tabela_processos *ProcessosRT)
{
	int i;
	for(i=0;i<Max_tabela;i++)
	{
		ProcessosRT->Linha[i].PID = 0;
		ProcessosRT->Linha[i].Intervalo = 0;
		ProcessosRT->Linha[i].Tmax = 0;
	}
}

//funcao de inserir processo na tabela de processos rt
bool insere_processo(double Intervalo, double Tmax, int PID, Tabela_processos *ProcessosRT)
{
	int i = 0;
	bool Achou = false;
	while((Achou == false)&&(i<Max_tabela))
	{
		if(ProcessosRT->Linha[i].PID == 0)
		{
			Achou = true;
			ProcessosRT->Linha[i].PID = PID;
			ProcessosRT->Linha[i].Intervalo = Intervalo;
			ProcessosRT->Linha[i].Tmax = Tmax;
		}
		else
		{i++;}
	}
	return Achou;
}

//funcao de remover processo da tabela de processos rt
bool remove_processo(int PID, Tabela_processos *ProcessosRT)
{
	int i = 0;
	bool Achou = false;
	while((Achou == false)&&(i<Max_tabela))
	{
		if(ProcessosRT->Linha[i].PID == PID)
		{
			Achou = true;
			ProcessosRT->Linha[i].PID = 0;
			ProcessosRT->Linha[i].Intervalo = 0;
			ProcessosRT->Linha[i].Tmax = 0;
		}
		else
		{i++;}
	}
	return Achou;
}
//funcao que retorna o valor Tmax de um proesso na lista
int retorna_tmax(int PID, Tabela_processos *ProcessosRT)
{
	int i = 0;
	bool Achou = false;
	while((Achou == false)&&(i<Max_tabela))
	{
		if(ProcessosRT->Linha[i].PID == PID)
		{
			return ProcessosRT->Linha[i].Tmax;
		}
		else
		{i++;}
	}
}

//funcao que retorna o valor Intervalo de um processo na lista
int retorna_intervalo(int PID, Tabela_processos *ProcessosRT)
{
	int i = 0;
	bool Achou = false;
	while((Achou == false)&&(i<Max_tabela))
	{
		if(ProcessosRT->Linha[i].PID == PID)
		{
			return ProcessosRT->Linha[i].Intervalo;
		}
		else
		{i++;}
	}
}

//######################### FUNCOES DO CALENDARIO #############################

//Imprime calendario
void imprime_calendario(Calendario *Eventos)
{
	int i;
	for(i=0;i<Max_tabela;i++)
	{
		if(Eventos->Evento[i].PID != 0)
		{printf("\n%f - %d - %d", Eventos->Evento[i].Tempo, Eventos->Evento[i].PID, Eventos->Evento[i].Acao);}
	}
}

//funcao de limpar a lista de eventos
void limpa_calendario(Calendario *Eventos)
{
	int i;
	for(i=0;i<Max_tabela;i++)
	{
		Eventos->Evento[i].Tempo = 0;
		Eventos->Evento[i].PID = 0;
		Eventos->Evento[i].Acao = 0;
	}
}

//funcao de inserir evento na lista de eventos
bool insere_evento(double Tempo, int PID, int Acao, Calendario *Eventos)
{
	int i = 0;
	bool Achou = false;
	while((Achou == false)&&(i<Max_calendario))
	{
		if(Eventos->Evento[i].Tempo == 0)
		{
			Achou = true;
			Eventos->Evento[i].Tempo = Tempo;
			Eventos->Evento[i].PID = PID;
			Eventos->Evento[i].Acao = Acao;
		}
		else
		{i++;}
	}
	return Achou;
}

//funcao de remover evento da lista procurando pelo tempo
bool remove_evento_por_tempo(double Tempo, Calendario *Eventos)
{
	int i = 0;
	bool Achou = false;
	while((Achou == false)&&(i<Max_calendario))
	{
		if(Eventos->Evento[i].Tempo == Tempo)
		{
			Achou = true;
			Eventos->Evento[i].Tempo = 0;
			Eventos->Evento[i].PID = 0;
			Eventos->Evento[i].Acao = 0;
		}
		else
		{i++;}
	}
	return Achou;
}

//funcao de remover evento da lista procurando pelo PID
bool remove_evento_por_pid(int PID, Calendario *Eventos)
{
	int i = 0;
	bool Achou = false;
	while((Achou == false)&&(i<Max_calendario))
	{
		if(Eventos->Evento[i].PID == PID)
		{
			Achou = true;
			Eventos->Evento[i].Tempo = 0;
			Eventos->Evento[i].PID = 0;
			Eventos->Evento[i].Acao = 0;
		}
		else
		{i++;}
	}
	return Achou;
}

//funcao de remover evento da lista procurando pelo PID
bool remove_evento_2_por_pid(int PID, Calendario *Eventos)
{
	int i = 0;
	bool Achou = false;
	while((Achou == false)&&(i<Max_calendario))
	{
		if((Eventos->Evento[i].PID == PID)&&(Eventos->Evento[i].Acao == 2))
		{
			Achou = true;
			Eventos->Evento[i].Tempo = 0;
			Eventos->Evento[i].PID = 0;
			Eventos->Evento[i].Acao = 0;
		}
		else
		{i++;}
	}
	return Achou;
}

//funcao de retornar evento mais proximo de acontecer
bool proximo_evento(double *Tempo, int *PID, int *Acao, Calendario *Eventos)
{
	int i = 0;
	bool Achou = false;
	double Menor_tempo;
	
	Menor_tempo = 9999999999;
	
	while(i<Max_calendario)
	{
		if((Eventos->Evento[i].Tempo < Menor_tempo)&&(Eventos->Evento[i].PID != 0))
		{
			Menor_tempo = Eventos->Evento[i].Tempo;
			*PID = Eventos->Evento[i].PID;
			*Acao = Eventos->Evento[i].Acao;
			Achou = true;
		}
		i++;
	}
	*Tempo = Menor_tempo;
	return Achou;
}

//******************************* FUNCAO MAIN **********************************

//funcao de teste para emular o esclalonador
/*int main(void)
{
	Calendario Eventos;
	Tabela_processos ProcessosRT;
	
	limpa_calendario(&Eventos);
	limpa_tabela(&ProcessosRT);
	
	printf("\n Tabela \n");
	imprime_tabela(&ProcessosRT);
	printf("\n Calendario \n");
	imprime_calendario(&Eventos);
	
	insere_processo(33, 2, 777, &ProcessosRT);
	insere_processo(33, 2, 456, &ProcessosRT);
	insere_processo(33, 2, 111, &ProcessosRT);
	
	insere_evento(7899878, 342, 2, &Eventos);
	insere_evento(7899878, 777, 2, &Eventos);
	insere_evento(7899878, 111, 5, &Eventos);
	
	printf("\n Tabela \n");
	imprime_tabela(&ProcessosRT);
	printf("\n Calendario \n");
	imprime_calendario(&Eventos);
	
	remove_processo(777, &ProcessosRT);
	remove_evento_por_pid(111, &Eventos);
	
	printf("\n Tabela \n");
	imprime_tabela(&ProcessosRT);
	printf("\n Calendario \n");
	imprime_calendario(&Eventos);
	
}*/


















